package com.zx.flow.api.util;

import com.zx.flow.api.config.FlowConfig;
import com.zx.flow.api.config.FlowConfigCheckHandler;
import com.zx.flow.api.exception.FlowException;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;


/**
 *
 */
@Slf4j
public class FlowConfigUtil {

    /**
     * 加载所有的本地流程文件
     */
    public static List<FlowConfig> loadLocalConfig() {
        try {
            List<String> flowConfigFiles = Util.readAllBpmFilenames();
            if (CollectionUtils.isEmpty(flowConfigFiles)) {
                log.warn("加载流程配置文件, 本地没有流程文件");
                return Collections.emptyList();
            }
            return flowConfigFiles.stream().map(x -> {
                FlowConfig config = loadLocalFileConfig(x.substring(0, x.lastIndexOf(".")));
                processor(config);
                FlowConfigCheckHandler.check(config);
                return config;
            }).collect(Collectors.toList());
        } catch (Exception e) {
            throw new FlowException("加载本地文件出现异常", e);
        }
    }

    /**
     * 加载本地文件
     *
     * @param fileName
     * @return
     */
    public static FlowConfig loadLocalFileConfig(String fileName) {
        try {
            String json = Util.readJosn(fileName);
            FlowConfig config = Util.getJavaObject(json, FlowConfig.class);
            log.info("加载本地流程配置, config={}", Util.getJsonStr(config));
            return config;
        } catch (Exception e) {
            log.error("加载流程配置文件, 解析流程配置异常", e);
        }
        return null;
    }

    /**
     * 处理流程配置文件
     *
     * @param config
     */
    public static void processor(FlowConfig config) {
        // 生成唯一id
        if (StringUtils.isEmpty(config.getId())) {
            config.setId(Util.uniqueId(config));
        }
        // 默认开启
        if (config.getEnable() == null) {
            config.setEnable(true);
        }
        // 设置版本1
        if (config.getVersion() == null) {
            config.setVersion(1);
        }
    }
}
